#ifndef CARGO_H
#define CARGO_H

#ifndef HEAD_Q_H
#include "../head_Q.h"
#endif

#ifndef OBJECT_QT_H
#include "../utils/Object_qt.h"
#endif

#ifndef GATE_H
#include "../Grid/Gate.h"
#endif

/// @brief 实现有关货物的操作

namespace cargo
{
    static const int DIVISIBLE = 0x00000020; // 可分割的mask 5位
} // namespace cargo

/********************************
 * @brief 货物类型的枚举
 * @details NONE, 无；SHAPE,图形货物; COLOR,颜色货物;
 * *******************************/
enum class CargoType
{
    NONE,
    COLOR,
    SHAPE = cargo::DIVISIBLE,
};

/********************************
 * @brief 颜色的类型的枚举
 * @details 使用位运算，便于混色
 * *******************************/
enum ColorType
{
    // 颜色类我们使用大写
    // 千万不要改这个值和顺序，混色会使用或运算和ascii码
    Color_NONE = '@', // 无颜色 @
    Color_RED,       // 红色 A
    Color_BLUE,      // 蓝色 B
    Color_PURPLE,    // 紫色 C
    Color_GREEN,     // 绿色 D
    Color_YELLOW,    // 黄色 E
    Color_CYAN,      // 青色 F
    Color_WHITE,     // 白色 G
};

/**
 *      货物的定义      虚类
 */
class CargoDefine
{
protected:

    virtual std::string serialization() = 0;
    virtual void deserialization() = 0;
    virtual void clear() = 0;
    virtual bool isNone() = 0;
public:
    CargoType cargo_type;
    std::string hash_id;
    CargoDefine();
    explicit CargoDefine(CargoType cargo_type);
    // 不需要拷贝函数
    virtual ~CargoDefine();
};

/**************************************
 * @brief 货物的基类
 *
 **************************************/
class Cargo
{
public:
    const CargoDefine *define;
    Object_Qt * object_qt;
    explicit Cargo(const CargoDefine *define = null);
    virtual ~Cargo();
    virtual void obj_moveTo(double x, double y, gate::GateDirection);
    virtual bool is_Divisble();
};

#endif
